package com.src.xyzk_personal.config;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.util.Log;

public class SerialPort {

	private static final String TAG = "SerialPort";
	//private static int mBaudRate = 921600; //波特率默认值
	private static int mStopBits = 1; //停止位默认值
	private static int mDataBits = 8; //数据位默认值
	private static int mParity = 0; //校验位默认值
	private static int mFlowCon = 0; //流控默认值
	private static int mFlags = 0;
	//private boolean isOpen = false; //是否打开串口标志

	/*
	 * Do not remove or rename the field mFd: it is used by native method close();
	 */
	private FileDescriptor mFd;
	private FileInputStream mFileInputStream;
	private FileOutputStream mFileOutputStream;

	public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException {

		/* Check access permission */
		//Log.d(TAG, "device: "+device+"; baudrate="+baudrate);
		Log.e(TAG, "canRead="+device.canRead()+";canWrite = "+device.canWrite());

		String str = mySerialPort.testcom();

		if (!device.canRead() || !device.canWrite()) {
			try {
				/* Missing read/write permission, trying to chmod the file */
				Process su;
				su = Runtime.getRuntime().exec("/system/bin/su");
				String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"
						+ "exit\n";
				su.getOutputStream().write(cmd.getBytes());
				if ((su.waitFor() != 0) || !device.canRead()
						|| !device.canWrite()) {
					throw new SecurityException();
				}
			} catch (Exception e) {
				e.printStackTrace();
				throw new SecurityException();
			}
		}

		mFd = mySerialPort.nativeOpen(device.getAbsolutePath(), baudrate, mStopBits, mDataBits, mParity, mFlowCon, mFlags);
		if (mFd == null)
		{
			Log.e(TAG, "native open returns null");
			throw new IOException();
		}
		mFileInputStream = new FileInputStream(mFd);
		mFileOutputStream = new FileOutputStream(mFd);
	}

	// Getters and setters
	public InputStream getInputStream() {
		return mFileInputStream;
	}

	public OutputStream getOutputStream() {
		return mFileOutputStream;
	}
	public void CloseUart()
	{
		mySerialPort.nativeClose();
	}

	// JNI
	//private native static FileDescriptor open(String path, int baudrate, int flags);
	///public native void close();
	//static {
	//	System.loadLibrary("serial_port");
	//}
}
